论文地址点这里

论文内容概述

本文结合RNN和FNN两种神经网络提出了一种新的个性推荐方法,希望解决传统的CF方法无法进行实时推荐的问题,最终在网易的考拉电商网站上取得了良好的效果。

简介(INTRODUCTION)

  • 传统CF模型存在的问题
    因为是基于用户购物习惯的推荐,使用的是历史信息,未能利用用户当前的浏览历史,因此无法进行实时推荐。

  • 如何进行实时推荐
    首先要考虑访问电商网站的用户属性,包括基本属性(浏览器、IP地址、个人基本信息、购买历史等)和动态属性(用户所浏览页面的信息),而基于后者,我们就可以猜测用户在本次访问中究竟想要购买什么,从而完成实时推荐。

  • 之后作者对系统主要面临的挑战、所构建DRNN的特点和其他一些技术作了介绍,即完成了本节内容。

推荐模块概述(OVERVIEW OF RECOMMENDATION MODULE)

  • 系统流程
    服务器首先接收用户请求并聚合为一个会话信息,之后将其输入到推荐系统中,经过RNN和FNN计算后输出推荐结果,并在页面中显示。

  • 数据格式
    数据收集:假设用户\(u_i\)访问网站,会生成日志文档\(D_j^l\)和会话文档\(D_i^s\)两种文档,两者关系为\(D_i^s=\{D_0^l,D_1^l,\cdots,D_{k-1}^l\}\),即一个会话文档对应多个日志文档。
    数据简化:又因为每个日志文档都可简化为一个URL地址\(p_j\),因此可得\(D_i^s=\{p_0,p_1,\cdots,p_{n-1}\}\)。
    最终的输入数据:访问网站的每个用户\(u_i\)都会对应一个\(D_i^s\),即构成了神经网络的输入数据。

DRNN具体介绍(DEEP RECURRENT NEURAL NETWORK)

  • RNN的特点
    RNN即循环神经网络,相比其他神经网络最大的特点是:其考虑了前后两个状态之间的关联,可以更好地处理序列信息。在本文的场景中,一个session可抽象为一系列的网页序列,因此利用RNN来进行推荐直观上是非常合适的。

  • 基本RNN模型
    在单个隐藏层的RNN中,隐藏层节点除了的输入和输出外,还会有一个自连接环,可以根据时间来不断地更新它的值。
    更新函数:\(a(i)=f(Ux(i)+Wa(i-1))\),\(a(i)\)表示在状态\(i\)下的节点值,\(x(i)\)表示输入值,\(U,W\)为相应的转移矩阵,\(f(x)\)为激活函数。
    公式理解:隐藏层节点每次更新除了会考虑输入值外,还会考虑该节点在前一状态下的值,因此RNN的结果可以反映时间序列的相应信息。

  • 有限状态的DRNN
    当RNN具有多个隐藏层时,即构成了DRNN。考虑DRNN中第\(i\)层的某个状态\(t\),其不仅会连接同层的状态\(t+1\),还会连接到第\(i+1\)层的状态\(t\),即构成了新的更新函数:
    $$ f(x)=\left\{
    \begin{align}
    &f(W_ia_i(t-1)+Z_i(a_{i-1}(t)+b_i(t)))&,& i>1 \\
    &f(W_ia_i(t-1)+Z_i(V_t+\theta (p_t)))&,& i=1
    \end{align}
    \right.
    $$

  • 引入历史状态节点的DRNN
    问题背景:受限于内存,我们不可能保存用户所有产生的状态;但如果使用\(n\)状态的滑动窗口,则只能选择最新的\(n\)个数据训练模型,会降低预测精度。因此作者引入了历史状态节点(history state)的概念。
    当用户访问的页面数\(x\)超过一定数量\(n\)时,我们将前\(x-n\)个状态组合起来作为历史状态节点,有
    $$\bar{V}=\sum_{i=0}^{x-n}\varepsilon_iV_i$$
    $$\varepsilon_i=\frac {\theta(p_i)} {\sum_{j=i}^{x-n}\theta(p_j)} $$
    公式理解:根据用户在页面的停留时间对前\(x-n\)个页面作加权平均,近似表征用户的历史信息,是一个既在一定程度上保证了模型精度,计算开销又不至于太大的折中方案。

  • 与协同过滤算法的结合
    问题背景:虽然协同过滤算法无法提供实时的推荐,但如果用户遵循以往购买习惯,其推荐效果还是很好的。因此作者引入了FNN模型来模拟CF算法,作为RNN的补充。
    另外使用FNN还有两点好处:

    • FNN和RNN共享相同的输出层,因此可以将二者的输出融合起来作为最终结果,来表征用户购买某件商品的概率。
    • 可以使用随机最速下降法(SGD)来训练RNN和FNN结合的权重,而不用人为地决定哪个网络更为重要,减轻了模型调参的工作量。
  • 如何生成训练数据
    用户从进入网站开始到最终购买商品,会经历一定数量的页面,个性推荐的本质目标就是减少这之间页面的数量。对于一次购买行为\(I\),其对应的页面路径为\(p_0,\cdots,p_{n-1}\rightarrow I\)。若对其进行优化,不一定非要优化成\(p_0\rightarrow I\)这样(当然这是最优情况),只要能减少用户的页面访问数量,都可以算作优化。因此我们的训练数据还可以是\(p_0,p_1\rightarrow I\)、 \(p_0,p_1,p_2\rightarrow I\)等,这样一次购买行为就可以产生\(n\)组训练数据,大大增加了我们的训练量。

  • 模型的实现
    作者使用了Caffe框架来实现模型,整个网络包含三层隐含层,且同一层次的神经元共享相同的权重和偏置矩阵。此外,模型的RNN部分包含4个状态的输入,FNN包含1个状态的输入。

模型调优(MODEL OPTIMIZATIONS)

这一节作者介绍了其为了改进模型性能所做的工作,并提出了一种自动调优框架,使得模型具有了更高的精度和更快的学习速度。

  • 自动代码生成器
    问题背景:模型中包括了很多参数,调整这些参数需要更改甚至重写Caffe脚本,非常繁琐。因此作者构建了一个代码生成器,其主要任务是接收参数值,输出对应的Caffe脚本。
    主要思想:首先将参数分为基本参数(损失函数、学习速率等)和网络结构参数(每层的神经元数),调整基本参数只需更改相应的值,而调整网络结构参数则需要改写Caffe脚本,因此我们只需重点关注网络结构参数即可。
    三种网络结构参数:文中提出了长、宽、高三种网络结构参数,分别对应隐含层数量、状态数以及隐含层与状态层的连接数,并编写了相应的代码生成算法,具体可见文中的Algorithm 1。

  • 模型调优
    为了求得表现更好的模型参数,作者采用了遗传算法这种启发式算法进行模型调优。
    染色体结构:\(C=(w,l,h,a_1,a_2,\cdots,a_L,\cdots)\),直观的理解就是将所有参数结合在了一起。
    适应度函数:\(fit=accuracy+\frac {1} {1+loss}\),\(accuracy\)为模型预测精度,\(loss\)为损失率。
    注:虽然遗传算法最终求得的是局部最优解,但因为参数调优本就是一个非常复杂、难以建模的过程,所以作者认为这样的解已经足够好了。

模型实验(EXPERIMENTS)

这一节作者对模型进行了全面的测试和分析,并分别研究几个重要因素对模型的影响。

  • 评价指标
    作者采用了预测正确率作为模型主要的评价指标,公式为\(accuracy=\frac {f(S)} {|S|}\),\(S\)代表训练样本总数,\(f(S)\)代表正确预测的样本数。

  • batch size的影响
    在使用默认参数训练模型时,增大batch size可以提高模型精度,但对于内存的消耗也更大。而一个有趣的现象是,使用调优框架后再训练模型,batch size对精度的影响就不再显著了,可见调优框架确实使得模型的表现更为优异了。

  • FNN的影响
    由Fig.11、Fig.12可得,FNN的使用显著提升了模型精度,尤其是同时使用调优框架和FNN的模型,精度提升了约10%,而且这还是在模型只推荐1个物品的情况下(即购买概率最大的那个物品),若模型返回10个物品,模型精度可以达到50%以上。
    同时,使用FNN并不会影响模型的收敛速率,即模型精度的提升并不会增加计算开销,这也是很重要的一点。

  • 历史状态节点的影响
    在使用默认参数训练模型时,使用历史状节点态可提高模型10%的精度;而使用了调优框架后,只能提升2%的精度,即调优过程降低了不同网络结构对模型的影响,这也侧面表明了作者所提出调优框架的优异性能。

  • 模型最终效果
    在DRNN和FNN结合的情况下,模型最终的预测精度达到了33.13%,页面路径压缩到了原先的72.41%,相当于用户从点进网站到最终购买商品,少浏览了30%的页面,效果还是显而易见的,毕竟用户每多浏览一个自己不感兴趣的页面,其离开网站的概率就会越大,这也就是推荐系统的作用所在,即帮助用户更快地进行选择。

个人感悟

关于推荐系统

  • 本文提出了基于RNN和FNN的推荐系统,最主要的原因是传统的CF算法基于用户间购物历史的相似度来做推荐,考虑的更多是用户的购物习惯,这就使其无法把握用户突发的、低频的购买需求。
  • 比如我平常很爱买衣服,网购的大部分物品都是衣服,但有一天突然想吃零食,就会在网站上浏览零食的相关页面,这时系统给我推荐的若还是衣服,就会影响用户体验,也不利于提高网站的销量,因此实时推荐是很有必要的。
  • 但同时,在生活大部分情况中,一个人还是会遵循其所形成的习惯去购物,这时基于购物习惯的推荐便能表现出很好的效果,因此CF算法也是很有必要的。
  • 综上,论文中使用RNN和FNN两种算法共同完成推荐,这种思路是合理的,也是符合我们的直观认知的。

关于RNN算法

  • RNN与其他网络最大的不同在于其隐含层节点的自连接性,在其更新函数中,不仅包括正常的输入值,还包括上一时刻中节点自身的值,这就像使得节点具有了“记忆”,这个记忆表征了时间序列中前后节点的关联,因此RNN适合处理时间序列或状态间具有一定联系的情况。
  • 对应到本文,用户在网站上购物必然会浏览一系列页面,而这些页面是否是有关联的呢?我认为是有的。比如我要买一个钱包,在第一个页面中没有浏览到我喜欢的款式,那我下一个访问的页面也会是关于钱包的,甚至我之后的浏览可能都会围绕钱包来展开,因此我们就可从用户初始的浏览内容来推测其实时的购买兴趣,这也就是作者应用RNN进行实时推荐的原因。

关于历史状态节点(history state)

  • 本文的一个创新在于引入了历史状态节点,来解决状态数过多、计算开销过大的问题。根据用户在页面上停留的时间,将多出的历史状态作加权平均,构成一个新的节点,这样既可以保留历史信息,又不会造成计算开销的大量增加,是一种比较折衷的方案。
  • 这也提示我们,在数据量过大的情况下,与其直接将一部分数据丢弃掉,不如将这部分数据做整合,采用加权平均或其他的提取信息的方法,构成新的节点来参与运算,在模型精度和计算开销之间取得平衡。

关于训练数据的生成

  • 本文针对用户一次的购买行为,将各种可能的路径优化方案都作为了训练数据送入模型进行训练,这样可以增加我们的训练量。因为对于有监督学习来说,带标签的数据是有限的,如何充分利用有限的标签数据去训练模型需要我们去研究,本文给了我们一种可行的思路。

关于模型调优

  • 本文提出了一种模型调优框架,大致可分为“生成参数”和“生成代码”两部分。
  • 首先将模型的相关参数整合成染色体,再利用遗传算法的杂交、变异等操作,生成下一代染色体,之后将参数传入代码生成器中生成对应的Caffe脚本,训练模型后,将结果回带到遗传算法的适应度函数中进行评估和自然选择,一轮轮地迭代,最终即可得出最优的参数组合。
  • 因为建模的复杂性和组合爆炸等问题,模型调优一直是机器学习的一个难点,在这种情况下,利用一些启发式算法进行智能调优不失为一个好的方法,这也是文章给我们的一个启示。

改进方案

关于模型的更新问题

  • 在文章中提到,顾客每完成一次购物,就相当于得到了一个”ground truth”,可以用来训练、调整模型,这样模型随着网站的运行就会不断优化和改进。
  • 如果顾客这次购物是在遵循自己以往的购物习惯,那么将结果用来继续训练模型是没有问题的,因为这个行为在今后还会多次发生,这样可以使得模型更了解顾客的购买习惯,从而更好地完成推荐。
  • 但如果这是一次”unexpected”的购物行为,就像平常都喜欢买衣服的我只是突然想吃点零食,如果模型把这个突发的低频需求当作了用户的购买习惯,在今后也多次向用户进行推荐,可能会造成用户的厌烦。
  • 因此我认为在模型的持续更新中,应该考虑到用户购买行为的属性,即对利用了RNN方式完成的推荐,要降低其对模型的后续影响。
  • 方案实现:可以通过减少训练样本数量的方式,对于通过RNN推荐完成的购买,不要将
    $$
    p_0 \rightarrow I \\
    p_0,p_1 \rightarrow I \\
    \cdots \\
    p_0,\cdots,p_{n-1} \rightarrow I
    $$
    所有的路径样本都送入训练,可以只送入后半段或后1/4的样本,让推荐发生的条件更为“苛刻”一些,从而使得模型不会在用户一进入网站就推荐一些低频、不经常需求的产品。

将社群属性加入到模型中

  • 论文在”Related Work”中提到CF推荐和基于内容的推荐相结合,会在社交网络上表现得更好,因此我认为可以将这种思路应用到本文,即在推荐系统中加入一定的社群属性。
  • 问题背景:在实际生活中,我们会更倾向于接受来自朋友的推荐,而非来自商家的推荐。尤其是本文的电商网站——网易考拉,是一个主打海淘的平台,用户对一些国外的品牌可能了解并不多,这时如果有来自自己社交圈的推荐,无疑会增加购买的概率。
  • 方案实现:可以考虑改进文中的FNN部分的方法,即首先通过用户填写的基本信息或其他网易系应用中的用户资料(如网易音乐、游戏等),对用户进行社群判别和分类,为每个用户构建一个“熟人圈”。在进行FNN推荐时,模型不仅推荐历史相似的用户购买的产品,也推荐来自熟人圈购买的产品,以将社群属性加入到推荐模型中。

关于推荐理由

  • 问题背景:目前用户对于推荐系统的态度,不仅是想“知其然”,也想“知其所以然”,即除了推荐的物品本身,用户也会想知道系统为什么会给自己推荐这个物品,因此如果能给推荐物品附上推荐理由,无疑会提升网站的用户体验。
  • 方案实现:因为本文是将两种神经网络的输出层共享,以类似加权平均的方式进行融合(见文章第三节D部分),来计算出用户购买某件物品的概率的,因此可以将最终结果的各个部分分离出来,从大到小排序,通过分析值最大的一项或几项来构造我们的推荐理由。
  • 具体形式:推荐理由的形式可以为“根据你以前购买过的xxx牛仔裤,我们猜你还喜欢这个”、“根据你刚刚浏览过的xxx钱包,我们猜你会喜欢这个”等等,以一种猜测、活泼的口吻对用户进行提示,以增加用户的购买欲望。

Post Date: 2018-09-13

版权声明: 本文为原创文章,转载请注明出处